package org.huawei260.牛客网刷题;

import java.util.LinkedList;
import java.util.Queue;

/**
 * @Auther: qingle
 * @Date: 2024/10/24-22:11
 * @Description:给定一个窗口大小和一个整数数据流，根据该滑动窗口的大小，计算滑动窗口里所有数字的平均值。
 *
 * 实现 MovingAverage 类：
 * MovingAverage(int size) 用窗口大小 size 初始化对象。
 * double next(int val) 成员函数 next 每次调用的时候都会往滑动窗口增加一个整数，
 * 请计算并返回数据流中最后 size 个值的移动平均值，即滑动窗口里所有数字的平均值。
 * @version: 1.0
 */
public class LCR041_数据流中的移动平均值_answer {

	static class MovingAverage {
		int size;
		double sum;
		Queue<Integer> q;

		/** 初始化数据流的大小为 size 的窗口 */
		public MovingAverage(int size) {
			this.size = size;
			this.sum = 0;
			this.q = new LinkedList<>();
		}

		/** 计算并返回数据流中最后 size 个值的移动平均值 */
		public double next(int val) {
			// 如果队列满了，移除最老的值
			if (q.size() == size) {
				sum -= q.remove();
			}
			// 将新值加入队列，并更新总和
			q.offer(val);
			sum += val;
			// 返回当前移动窗口的平均值
			return sum / q.size();
		}
	}

	/**
	 * 使用示例
	 */
	public static class MovingAverageExample {
		public static void main(String[] args) {
			MovingAverage movingAverage = new MovingAverage(3);
			System.out.println(movingAverage.next(1)); // 返回 1.0
			System.out.println(movingAverage.next(10)); // 返回 (1 + 10) / 2 = 5.5
			System.out.println(movingAverage.next(3)); // 返回 (1 + 10 + 3) / 3 = 4.66667
			System.out.println(movingAverage.next(5)); // 返回 (10 + 3 + 5) / 3 = 6.0
		}
	}

}
